#ifndef SYMTABLE_H
#define SYMTABLE_H
#include<bits/stdc++.h>
#include"driver.h"
#include"def.h"
#ifdef CHAPTER4
#define PRINT_SYMTABLE
#endif
struct sym {       //这里只列出了一个符号表项的部分属性，没考虑属性间的互斥 
    std::string name;   //变量或函数名  
    int level;        //层号  
    std::string type;         //变量类型或函数返回值类型  
    int dimension;
    std::vector<int> degree;//
    int arraySize;
    char flag;       //符号标记，函数：'F'  变量：'V'   参数：'P'  临时变量：'T' 
    int  paramnum;  //对函数适用，记录形式参数个数  
    int lineno;
    int  strong;
    int index;
    std::string alias;   //别名，为解决嵌套层次使用   
    char offset;      //外部变量和局部变量在其静态数据区或活动记录中的偏移量，  
//或记录函数活动记录大小，目标代码生成时使用  
    //函数入口等实验可能会用到的属性...
    sym(){}
    ~sym(){}
    sym(std::string name,int level,std::string type,char flag,int paramnum
                    ,int strong,int lineno,int dimension);
     virtual string toString();
     void display(int index);
    };  
//符号表  
struct symtable{  
    std::vector<sym*> symbols;  
    int index;
    int level;
    symtable(); 
    ~symtable();
    sym* find(std::string name);
    int  find(sym* id,int del);
    void add(sym* e);
    void addlist(std::vector<sym*> list);
    void pop(int level);
    void display();
};

struct symDriver:driver{
    sym* id;
    vector<sym*> ids;
    int level;
    symDriver();
    symDriver(driver* myDriver);
    static symDriver* getSymDriver(driver* myDriver);
    void correspond();
};

extern symtable* mytable;

int PARAM_sym     (driver* originDriver);
int FUNCDEF_sym   (driver* originDriver);
int DECL_sym      (driver* originDriver);
int add_sym       (driver* originDriver);
int addlist_sym   (driver* originDriver);
int level_pass    (driver* originDriver);
int level_inc     (driver* originDriver);
int level_dec     (driver* originDriver);
#endif
